
package net.sea.setup.action.ext.impl;

import java.io.File;
import java.util.List;
import java.util.Map;

import net.sea.commons.context.AppContext;
import net.sea.commons.util.ELUtils;
import net.sea.commons.util.InstallMsgUtils;
import net.sea.commons.util.ELUtils.EL;
import net.sea.commons.util.FileUtils;
import net.sea.setup.action.AbstractAction;
import net.sea.setup.action.constants.Constants;

/**
 * 处理服务器启动脚本的操作类
 *
 * @author huachengwu 
 */
public class ServerStartupAction extends AbstractAction {

	/*
	 * 安裝服务器启动脚本
	 * 
	 * @see
	 * com.ec.setup.action.IAction#install(net.sea.commons.context.AppContext,
	 * java.util.Map)
	 */
	@Override
	public void install(AppContext context, Map<String, String> parMap) {
		logger.info(parMap.get(Constants.INSTALL_DESC_KEY));
		long startTime = System.currentTimeMillis();
		InstallMsgUtils.setInstallMsg("创建服务器启动脚本");
		// 源文件地址
		String oriFile = parMap.get(Constants.KEY_ORI_FILE);
		List<EL> els = ELUtils.getVarName(oriFile);
		for (EL el : els) {
			String value = (String) context.getAttribute(el.getVarName());
			oriFile = oriFile.replace(el.getElExp(), value.replace("\\", "/"));
		}
		if (logger.isDebugEnabled()) {
			logger.debug("源地址：" + oriFile);
		}
		// 服务器启动脚本地址
		String destFile = parMap.get(Constants.KEY_DEST_FILE);
		els = ELUtils.getVarName(destFile);
		for (EL el : els) {
			String value = (String) context.getAttribute(el.getVarName());
			destFile = destFile
					.replace(el.getElExp(), value.replace("\\", "/"));
		}
		if (logger.isDebugEnabled()) {
			logger.debug("目标地址：" + destFile);
		}
		try {
			// 获取模板文件内容
			String cmd = FileUtils.read(oriFile);
			els = ELUtils.getVarName(cmd);
			// 替换文件中的参数
			for (EL el : els) {
				String value = (String) parMap.get(el.getVarName());
				List<EL> tmpEls = ELUtils.getVarName(value);
				for (EL el2 : tmpEls) {
					String value1 = (String) context.getAttribute(el2
							.getVarName());
					value = value.replace(el2.getElExp(),
							value1.replace("\\", "/"));
				}
				File f = new File(value);
				if (!f.exists()) {
					f.mkdirs();
				}
				cmd = cmd.replace(el.getElExp(), value.replace("\\", "/"));
			}
			if (logger.isDebugEnabled()) {
				logger.debug("创建快捷方式脚本：" + cmd);
			}
			// 回写文件
			FileUtils.wirte(cmd, new File(destFile));
		} catch (Exception e) {
			logger.error("安装服务器启动脚本失败", e);
		}
		long endTime = System.currentTimeMillis();
		if (logger.isDebugEnabled()) {
			logger.debug("操作执行时间：" + (endTime - startTime) / 1000.0 + "秒");
		}
	}

	/*
	 * 卸载服务器启动脚本
	 * 
	 * @see
	 * com.ec.setup.action.IAction#uninstall(net.sea.commons.context.AppContext,
	 * java.util.Map)
	 */
	@Override
	public void uninstall(AppContext context, Map<String, String> parMap) {
		logger.info(parMap.get(Constants.UNINSTALL_DESC_KEY));
		long startTime = System.currentTimeMillis();
		// 服务器启动脚本地址
		String destFile = parMap.get(Constants.KEY_DEST_FILE);
		List<EL> els = ELUtils.getVarName(destFile);
		for (EL el : els) {
			String value = (String) context.getAttribute(el.getVarName());
			destFile = destFile
					.replace(el.getElExp(), value.replace("\\", "/"));
		}
		if (logger.isDebugEnabled()) {
			logger.debug(destFile);
		}
		// 系统参数配置目录
		String configFile = parMap.get("config");
		els = ELUtils.getVarName(configFile);
		for (EL el : els) {
			String value = (String) context.getAttribute(el.getVarName());
			configFile = configFile.replace(el.getElExp(),
					value.replace("\\", "/"));
		}
		if (logger.isDebugEnabled()) {
			logger.debug(configFile);
		}
		try {
			// 删除配置目录
			FileUtils.delete(new File(configFile));
			// 删除脚本文件
			FileUtils.delete(new File(destFile));
		} catch (Exception e) {
			logger.error("卸载服务器启动脚本失败", e);
		}
		long endTime = System.currentTimeMillis();
		if (logger.isDebugEnabled()) {
			logger.debug("操作执行时间：" + (endTime - startTime) / 1000.0 + "秒");
		}
	}

}

/*
 * 修改历史 $Log$
 */